package com.hzdl.house_mgr.util;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.HashMap;
import java.util.Map;

public class ZXingCode {

    // 定义颜色
    private static final int BLACK =0xFF000000;// 黑
    private static final int WHITE =0xFFFFFFFF;// 白

    // 创建对象，保存二维码设置信息
    private static Map<EncodeHintType,Object> hint = null;
    static {
        hint = new HashMap<>();
        // 纠错级别 L(7%)<M(15%)<Q(25%)<H(30%)
        // 纠错级别越高，纠错信息占用的空间越多，那么能存储的有用信息就越少
        hint.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);
        //设置编码格式
        hint.put(EncodeHintType.CHARACTER_SET,"utf-8");
        // 边距大小  1,2,3,4  （4 是最大）
        hint.put(EncodeHintType.MARGIN, 1);
    }

    /**
     * 创建二维码，保存到磁盘
     */
    public static void createZXingCodeToFile(){
        try {
            BufferedImage image = createZXingCodeToStream("wangyun",300,300);
            // 把二维码保存到磁盘
            File file = new File("E:\\wy.jpg");
            if(!file.exists()){
                file.createNewFile();
            }
            ImageIO.write(image,"JPEG",file);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static BufferedImage createZXingCodeToStream(String content , int _width ,int _height){

        try {
            // 创建二维码对象
            /**
             * var1 : 保存的内容
             * var2 ： BarcodeFormat.QR_CODE:要解析的类型（二维码）
             * var3 ：二维码宽
             * var4 ： 二维码高
             * var5 ： 二维码基础设置
             */
            BitMatrix bitMatrix =  new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE,_width,_height, hint);

            int width= bitMatrix.getWidth();
            int height = bitMatrix.getHeight();
//          public BufferedImage(int width, int height, int imageType);
            /**
             * width ： 二维码宽
             * height ： 二维码 高
             * imageType ： 类型
             */
            BufferedImage image = new BufferedImage(width,height, BufferedImage.TYPE_INT_RGB);

            // 绘制二维码
            for(int i = 0 ; i<width ;i++){
                for (int j =0 ; j<height;j++){
                    image.setRGB(i , j , bitMatrix.get(i,j) ? BLACK: WHITE);
                }
            }

            return image;
        } catch (WriterException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 创建带logo的二维码， 保存到磁盘
     * @param logoStream
     */
    public static void createZXingCodeByLogoToFile(String content , int _width , int _height, InputStream logoStream){
        try {
            BufferedImage image = createZXingCodeToStream(content,_width,_height);


            if(logoStream!=null) {
                // 添加LOGO

                // logo输入流转换为BufferedImage
                BufferedImage logoImage =  ImageIO.read(logoStream);

                //获取logo宽高
                int logo_width = logoImage.getWidth();
                int logo_height = logoImage.getHeight();

                // logo的大小是二维码的1/5
                int ewm_width = _width / 5;
                int ewm_height = _height/ 5 ;

                // 计算最终logo的大小
                logo_width = logo_width > ewm_width ? ewm_width : logo_width;
                logo_height = logo_height > ewm_height ? ewm_height : logo_height;


                // 如何确定显示为位置
                int x = (_width -logo_width )/2;
                int y = (_height - logo_height) /2;

                // 从二维码图片对象中获取画笔对象
                Graphics2D graphics = image.createGraphics();
                // 把logo图片绘制到二维码中
                graphics.drawImage(logoImage , x ,y , logo_width, logo_height ,null);

                graphics.setStroke(new BasicStroke(2));
                graphics.setColor(Color.WHITE);
                //画白色边框
                graphics.drawRoundRect(x, y, logo_width, logo_height, 15, 15);
                graphics.dispose();//让画上的去的内容生效
            }

            // 把二维码保存到磁盘
            File file = new File("E:\\wy_logo.jpg");
            if(!file.exists()){
                file.createNewFile();
            }
            ImageIO.write(image,"JPEG",file);


        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    public static void main(String[] args) {
        try {
            FileInputStream is = new FileInputStream("E:\\face.jpg");
            createZXingCodeByLogoToFile("xuhao",300,300,is);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
}
